
import java.util.Vector;

/**
 * StackVector.java
 * @author Oscar Castañeda 11086 Sección 20
 * @since 16/07/2012
 * @version 1
 * @param <E> Tipo de objetos que almacenará la implementación de pila.
 * Descripción: Implementación de la interfaz pila usando la clase Vector.
 *               El último elemento del vector es la cima de la pila.
 */
public class StackVector <E> implements Stack <E> {

    /**
     * Vector sobre el cual se implementará el Stack (pila).
     */
    protected Vector pila;
    
    /**
     * Construye una nueva pila implementada con un vector.
     * Pre-Condiciones: No hay.
     * Post-Condiciones: Se ha creado una pila nueva y vacía.
     */
    public StackVector(){
        pila = new Vector<E>(0,1);
    }
    
    /**
     * Permite añadir un objeto a la pila, colocándolo en su cima.
     * Pre-Condiciones: La pila debe estar creada.
     * Post-Condiciones: Se almacena el objeto en la cima de la pila.
     * @param item Objeto a añadir en la cima de la pila.
     */
    @Override
    public void push(E item) {
        pila.add(item);
    }

    /**
     * Permite extraer el objeto en la cima de la pila.
     * Pre-condiciones: La pila no debe de estar vacía.
     * Post-Condiciones: El objeto que ocupaba la cima ha sido removido y 
     *                   devuelto.
     * @return Objeto en la cima de la pila.
     */
    @Override
    public E pop() {
        return (E) pila.remove(pila.size()-1);
    }

    /**
     * Regresa el objeto en la cima de la pila sin removerlo.
     * Pre-condiciones: La pila no está vacía.
     * Post-condiciones: El objeto que estaba en la cima de la pila ha sido
     *                   devuelto.
     * @return Objeto en la cima de la pila.
     */
    @Override
    public E peek() {
        return (E) pila.lastElement();
    }

    /**
     * Permite saber si la pila esta vacía o no.
     * Pre-Condiciones: Debe de existir una instancia de la pila.
     * Post-Condiciones: Se devuelve true si la pila está vacía.
     * @return boolean true si está vacía; false en caso contrario.
     */
    @Override
    public boolean empty() {
        return pila.isEmpty();
    }

    /**
     * Devuelve el tamaño actual de la pila.
     * Pre-Condiciones: Debe existir una instancia de la pila.
     * Post-Condiciones: Se devuelve el número de elementos almacenados en la pila.
     * @return int Número de elementos que contiene la pila.
     */
    @Override
    public int size() {
        return pila.size();
    }
    
}